pyegeria 5.4.0.28__py3-none-any.whl → 5.5.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyegeria might be problematic. Click here for more details.

Files changed (433) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/collection_actions.py +197 -0
  4. commands/cat/dr_egeria_command_help.py +137 -38
  5. commands/cat/dr_egeria_jupyter.py +7 -7
  6. commands/cat/dr_egeria_md.py +10 -267
  7. commands/cat/exp_list_glossaries.py +11 -14
  8. commands/cat/get_asset_graph.py +37 -267
  9. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  10. commands/cat/get_project_dependencies.py +14 -14
  11. commands/cat/get_project_structure.py +15 -14
  12. commands/cat/get_tech_type_elements.py +16 -116
  13. commands/cat/glossary_actions.py +145 -298
  14. commands/cat/list_assets.py +3 -11
  15. commands/cat/list_cert_types.py +17 -63
  16. commands/cat/list_collections.py +17 -139
  17. commands/cat/list_deployed_catalogs.py +15 -27
  18. commands/cat/list_deployed_database_schemas.py +27 -43
  19. commands/cat/list_deployed_databases.py +16 -31
  20. commands/cat/list_deployed_servers.py +35 -54
  21. commands/cat/list_glossaries.py +18 -17
  22. commands/cat/list_projects.py +10 -12
  23. commands/cat/list_tech_type_elements.py +21 -37
  24. commands/cat/list_tech_types.py +13 -25
  25. commands/cat/list_terms.py +38 -79
  26. commands/cat/list_todos.py +4 -11
  27. commands/cat/list_user_ids.py +3 -10
  28. commands/cat/my_reports.py +559 -0
  29. commands/cat/run_report.py +394 -0
  30. commands/cat/{list_format_set.py → run_report_orig.py} +136 -44
  31. commands/cli/egeria.py +182 -219
  32. commands/cli/egeria_cat.py +32 -59
  33. commands/cli/egeria_my.py +13 -0
  34. commands/cli/egeria_ops.py +69 -74
  35. commands/cli/egeria_tech.py +17 -93
  36. commands/{cat → deprecated}/list_data_designer.py +2 -4
  37. commands/{cat → deprecated}/list_data_structures_full.py +3 -6
  38. commands/deprecated/old_get_asset_graph.py +315 -0
  39. commands/my/__init__.py +0 -2
  40. commands/my/list_my_profile.py +27 -34
  41. commands/my/list_my_roles.py +1 -7
  42. commands/my/monitor_my_todos.py +1 -7
  43. commands/my/monitor_open_todos.py +6 -7
  44. commands/my/todo_actions.py +4 -5
  45. commands/ops/__init__.py +0 -2
  46. commands/ops/gov_server_actions.py +17 -21
  47. commands/ops/list_archives.py +17 -38
  48. commands/ops/list_catalog_targets.py +33 -40
  49. commands/ops/load_archive.py +14 -11
  50. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  51. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  52. commands/ops/monitor_engine_activity.py +79 -77
  53. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  54. commands/ops/monitor_platform_status.py +38 -50
  55. commands/ops/monitor_server_startup.py +6 -11
  56. commands/ops/monitor_server_status.py +7 -11
  57. commands/ops/orig_monitor_server_list.py +8 -8
  58. commands/ops/orig_monitor_server_status.py +1 -5
  59. commands/ops/refresh_integration_daemon.py +5 -5
  60. commands/ops/restart_integration_daemon.py +5 -5
  61. commands/ops/table_integ_daemon_status.py +6 -6
  62. commands/ops/x_engine_actions.py +7 -7
  63. commands/tech/__init__.py +0 -2
  64. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  65. commands/tech/get_element_info.py +20 -29
  66. commands/tech/get_guid_info.py +23 -42
  67. commands/tech/get_tech_details.py +20 -35
  68. commands/tech/get_tech_type_template.py +28 -39
  69. commands/tech/list_all_om_type_elements.py +24 -30
  70. commands/tech/list_all_om_type_elements_x.py +22 -28
  71. commands/tech/list_all_related_elements.py +19 -28
  72. commands/tech/list_anchored_elements.py +22 -30
  73. commands/tech/list_asset_types.py +19 -24
  74. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  75. commands/tech/list_elements_by_property_value.py +19 -25
  76. commands/tech/list_elements_by_property_value_x.py +20 -28
  77. commands/tech/list_elements_for_classification.py +28 -41
  78. commands/tech/list_gov_action_processes.py +16 -27
  79. commands/tech/list_information_supply_chains.py +22 -30
  80. commands/tech/list_registered_services.py +14 -26
  81. commands/tech/list_related_elements_with_prop_value.py +15 -25
  82. commands/tech/list_related_specification.py +1 -4
  83. commands/tech/list_relationship_types.py +15 -25
  84. commands/tech/list_relationships.py +20 -36
  85. commands/tech/list_solution_blueprints.py +28 -33
  86. commands/tech/list_solution_components.py +23 -29
  87. commands/tech/list_solution_roles.py +21 -32
  88. commands/tech/list_tech_templates.py +51 -54
  89. commands/tech/list_valid_metadata_values.py +5 -9
  90. commands/tech/table_tech_templates.py +2 -6
  91. commands/tech/x_list_related_elements.py +1 -4
  92. examples/GeoSpatial Products Example.py +524 -0
  93. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  94. examples/Jupyter Notebooks/README.md +2 -0
  95. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  96. examples/Jupyter Notebooks/common/__init__.py +14 -0
  97. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  98. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  99. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  100. examples/Jupyter Notebooks/common/globals.py +154 -0
  101. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  102. examples/format_sets/all_format_sets.json +910 -0
  103. examples/format_sets/custom_format_sets.json +268 -0
  104. examples/format_sets/subset_format_sets.json +187 -0
  105. examples/format_sets_save_load_example.py +291 -0
  106. examples/jacquard_data_sets.py +129 -0
  107. examples/output_formats_example.py +193 -0
  108. examples/test_jacquard_data_sets.py +54 -0
  109. examples/test_jacquard_data_sets_scenarios.py +94 -0
  110. md_processing/__init__.py +33 -24
  111. md_processing/command_dispatcher.py +33 -0
  112. md_processing/command_mapping.py +221 -0
  113. md_processing/data/commands/commands_data_designer.json +537 -0
  114. md_processing/data/commands/commands_external_reference.json +733 -0
  115. md_processing/data/commands/commands_feedback.json +155 -0
  116. md_processing/data/commands/commands_general.json +204 -0
  117. md_processing/data/commands/commands_glossary.json +218 -0
  118. md_processing/data/commands/commands_governance.json +3678 -0
  119. md_processing/data/commands/commands_product_manager.json +865 -0
  120. md_processing/data/commands/commands_project.json +642 -0
  121. md_processing/data/commands/commands_solution_architect.json +366 -0
  122. md_processing/data/commands.json +6489 -30060
  123. md_processing/data/{commands-working.json → commands_working.json} +9304 -13513
  124. md_processing/data/gened_report_specs.py +6584 -0
  125. md_processing/data/generated_format_sets.json +6533 -0
  126. md_processing/data/generated_format_sets_old.json +4137 -0
  127. md_processing/data/generated_format_sets_old.py +45 -0
  128. md_processing/dr_egeria.py +182 -0
  129. md_processing/md_commands/data_designer_commands.py +195 -583
  130. md_processing/md_commands/ext_ref_commands.py +530 -0
  131. md_processing/md_commands/feedback_commands.py +726 -0
  132. md_processing/md_commands/glossary_commands.py +106 -490
  133. md_processing/md_commands/governance_officer_commands.py +129 -18
  134. md_processing/md_commands/product_manager_commands.py +362 -115
  135. md_processing/md_commands/project_commands.py +351 -134
  136. md_processing/md_commands/solution_architect_commands.py +276 -232
  137. md_processing/md_commands/view_commands.py +295 -0
  138. md_processing/md_processing_utils/common_md_proc_utils.py +258 -166
  139. md_processing/md_processing_utils/common_md_utils.py +138 -43
  140. md_processing/md_processing_utils/determine_width.py +103 -0
  141. md_processing/md_processing_utils/extraction_utils.py +100 -39
  142. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  143. md_processing/md_processing_utils/generate_dr_help.py +61 -33
  144. md_processing/md_processing_utils/generate_md_cmd_templates.py +20 -19
  145. md_processing/md_processing_utils/generate_md_templates.py +3 -12
  146. md_processing/md_processing_utils/md_processing_constants.py +1053 -72
  147. pyegeria/__init__.py +203 -158
  148. pyegeria/core/__init__.py +40 -0
  149. pyegeria/core/_base_platform_client.py +574 -0
  150. pyegeria/core/_base_server_client.py +573 -0
  151. pyegeria/{_exceptions_new.py → core/_exceptions.py} +62 -30
  152. pyegeria/{_globals.py → core/_globals.py} +14 -3
  153. pyegeria/core/_server_client.py +6073 -0
  154. pyegeria/{_validators.py → core/_validators.py} +7 -8
  155. pyegeria/core/config.py +654 -0
  156. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  157. pyegeria/core/load_config.py +37 -0
  158. pyegeria/{logging_configuration.py → core/logging_configuration.py} +1 -1
  159. pyegeria/core/mcp_adapter.py +144 -0
  160. pyegeria/core/mcp_server.py +212 -0
  161. pyegeria/core/utils.py +405 -0
  162. pyegeria/{_client.py → deprecated/_client.py} +24 -25
  163. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  164. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1987 -1877
  165. pyegeria/{output_formatter.py → deprecated/output_formatter_with_machine_keys.py} +298 -45
  166. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +155 -171
  167. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  168. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  169. pyegeria/egeria_cat_client.py +26 -70
  170. pyegeria/egeria_client.py +130 -93
  171. pyegeria/egeria_config_client.py +40 -46
  172. pyegeria/egeria_tech_client.py +141 -54
  173. pyegeria/models/__init__.py +150 -0
  174. pyegeria/{models.py → models/models.py} +156 -20
  175. pyegeria/omvs/__init__.py +84 -0
  176. pyegeria/omvs/action_author.py +342 -0
  177. pyegeria/omvs/actor_manager.py +5980 -0
  178. pyegeria/omvs/asset_catalog.py +842 -0
  179. pyegeria/omvs/asset_maker.py +2736 -0
  180. pyegeria/omvs/automated_curation.py +4403 -0
  181. pyegeria/omvs/classification_manager.py +11213 -0
  182. pyegeria/{collection_manager.py → omvs/collection_manager.py} +1334 -1160
  183. pyegeria/omvs/community_matters_omvs.py +468 -0
  184. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  185. pyegeria/{data_designer.py → omvs/data_designer.py} +1115 -660
  186. pyegeria/omvs/data_discovery.py +869 -0
  187. pyegeria/omvs/data_engineer.py +372 -0
  188. pyegeria/omvs/digital_business.py +1133 -0
  189. pyegeria/omvs/external_links.py +1752 -0
  190. pyegeria/omvs/feedback_manager.py +834 -0
  191. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  192. pyegeria/{glossary_manager.py → omvs/glossary_manager.py} +857 -519
  193. pyegeria/{governance_officer.py → omvs/governance_officer.py} +964 -468
  194. pyegeria/omvs/lineage_linker.py +314 -0
  195. pyegeria/omvs/location_arena.py +1525 -0
  196. pyegeria/omvs/metadata_expert.py +668 -0
  197. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  198. pyegeria/omvs/my_profile.py +1042 -0
  199. pyegeria/omvs/notification_manager.py +358 -0
  200. pyegeria/omvs/people_organizer.py +394 -0
  201. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  202. pyegeria/omvs/product_manager.py +1825 -0
  203. pyegeria/omvs/project_manager.py +1907 -0
  204. pyegeria/omvs/reference_data.py +1140 -0
  205. pyegeria/omvs/registered_info.py +334 -0
  206. pyegeria/omvs/runtime_manager.py +2817 -0
  207. pyegeria/omvs/schema_maker.py +446 -0
  208. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  209. pyegeria/{solution_architect_omvs.py → omvs/solution_architect.py} +1886 -1505
  210. pyegeria/omvs/specification_properties.py +37 -0
  211. pyegeria/omvs/subject_area.py +1042 -0
  212. pyegeria/omvs/template_manager_omvs.py +236 -0
  213. pyegeria/omvs/time_keeper.py +1761 -0
  214. pyegeria/omvs/valid_metadata.py +3221 -0
  215. pyegeria/omvs/valid_metadata_lists.py +37 -0
  216. pyegeria/omvs/valid_type_lists.py +37 -0
  217. pyegeria/view/__init__.py +28 -0
  218. pyegeria/{_output_format_models.py → view/_output_format_models.py} +160 -24
  219. pyegeria/view/_output_formats.py +14 -0
  220. pyegeria/view/base_report_formats.py +2719 -0
  221. pyegeria/view/dr_egeria_reports.py +56 -0
  222. pyegeria/view/format_set_executor.py +397 -0
  223. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  224. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  225. pyegeria/view/output_formatter.py +1297 -0
  226. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  227. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  228. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  229. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  230. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  231. commands/cat/.DS_Store +0 -0
  232. commands/cat/.env +0 -8
  233. commands/cat/README.md +0 -16
  234. commands/cat/debug_log +0 -1126
  235. commands/cat/debug_log.2025-08-18_11-34-38_088636.zip +0 -0
  236. commands/cat/list_categories.py +0 -192
  237. commands/cat/logs/pyegeria.log +0 -4
  238. commands/cli/debug_log +0 -0
  239. commands/cli/debug_log.log +0 -0
  240. commands/cli/txt_custom_v2.tcss +0 -19
  241. commands/my/README.md +0 -17
  242. commands/ops/README.md +0 -24
  243. commands/ops/logs/pyegeria.log +0 -0
  244. commands/ops/monitor_asset_events.py +0 -108
  245. commands/tech/README.md +0 -24
  246. md_processing/.DS_Store +0 -0
  247. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-30-37.md +0 -163
  248. md_processing/dr-egeria-outbox/Collections-2025-08-12-13-35-58.md +0 -474
  249. md_processing/dr_egeria_inbox/Derive-Dr-Gov-Defs.md +0 -8
  250. md_processing/dr_egeria_inbox/Dr.Egeria Templates.md +0 -873
  251. md_processing/dr_egeria_inbox/arch_test.md +0 -57
  252. md_processing/dr_egeria_inbox/archive/dr_egeria_intro.md +0 -254
  253. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_more_terms.md +0 -696
  254. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part1.md +0 -254
  255. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part2.md +0 -298
  256. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part3.md +0 -608
  257. md_processing/dr_egeria_inbox/archive/dr_egeria_intro_part4.md +0 -94
  258. md_processing/dr_egeria_inbox/archive/freddie_intro.md +0 -284
  259. md_processing/dr_egeria_inbox/archive/freddie_intro_orig.md +0 -275
  260. md_processing/dr_egeria_inbox/archive/test-term.md +0 -110
  261. md_processing/dr_egeria_inbox/cat_test.md +0 -100
  262. md_processing/dr_egeria_inbox/collections.md +0 -39
  263. md_processing/dr_egeria_inbox/data_designer_debug.log +0 -6
  264. md_processing/dr_egeria_inbox/data_designer_out.md +0 -60
  265. md_processing/dr_egeria_inbox/data_designer_search_test.md +0 -11
  266. md_processing/dr_egeria_inbox/data_field.md +0 -54
  267. md_processing/dr_egeria_inbox/data_spec.md +0 -77
  268. md_processing/dr_egeria_inbox/data_spec_test.md +0 -2406
  269. md_processing/dr_egeria_inbox/data_test.md +0 -179
  270. md_processing/dr_egeria_inbox/data_test2.md +0 -429
  271. md_processing/dr_egeria_inbox/data_test3.md +0 -462
  272. md_processing/dr_egeria_inbox/dr_egeria_data_designer_1.md +0 -124
  273. md_processing/dr_egeria_inbox/dr_egeria_intro_categories.md +0 -168
  274. md_processing/dr_egeria_inbox/dr_egeria_intro_part1.md +0 -280
  275. md_processing/dr_egeria_inbox/dr_egeria_intro_part2.md +0 -318
  276. md_processing/dr_egeria_inbox/dr_egeria_intro_part3.md +0 -1073
  277. md_processing/dr_egeria_inbox/dr_egeria_isc1.md +0 -44
  278. md_processing/dr_egeria_inbox/generated_help_report.md +0 -9
  279. md_processing/dr_egeria_inbox/glossary_creation_experiment.ipynb +0 -341
  280. md_processing/dr_egeria_inbox/glossary_list.md +0 -5
  281. md_processing/dr_egeria_inbox/glossary_search_test.md +0 -40
  282. md_processing/dr_egeria_inbox/glossary_test1.md +0 -324
  283. md_processing/dr_egeria_inbox/gov_def.md +0 -482
  284. md_processing/dr_egeria_inbox/gov_def2.md +0 -447
  285. md_processing/dr_egeria_inbox/img.png +0 -0
  286. md_processing/dr_egeria_inbox/product.md +0 -211
  287. md_processing/dr_egeria_inbox/rel.md +0 -8
  288. md_processing/dr_egeria_inbox/sb.md +0 -119
  289. md_processing/dr_egeria_inbox/solution-components.md +0 -136
  290. md_processing/dr_egeria_inbox/solution_blueprints.md +0 -118
  291. md_processing/dr_egeria_inbox/synonym_test.md +0 -42
  292. md_processing/dr_egeria_inbox/t2.md +0 -268
  293. md_processing/dr_egeria_outbox/.obsidian/app.json +0 -1
  294. md_processing/dr_egeria_outbox/.obsidian/appearance.json +0 -1
  295. md_processing/dr_egeria_outbox/.obsidian/community-plugins.json +0 -6
  296. md_processing/dr_egeria_outbox/.obsidian/core-plugins.json +0 -31
  297. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/data.json +0 -10
  298. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/main.js +0 -4459
  299. md_processing/dr_egeria_outbox/.obsidian/plugins/calendar/manifest.json +0 -10
  300. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/data.json +0 -3
  301. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/main.js +0 -153
  302. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/manifest.json +0 -11
  303. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-kanban/styles.css +0 -1
  304. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/main.js +0 -500
  305. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +0 -12
  306. md_processing/dr_egeria_outbox/.obsidian/plugins/obsidian-tasks-plugin/styles.css +0 -1
  307. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/main.js +0 -37
  308. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/manifest.json +0 -11
  309. md_processing/dr_egeria_outbox/.obsidian/plugins/templater-obsidian/styles.css +0 -220
  310. md_processing/dr_egeria_outbox/.obsidian/types.json +0 -28
  311. md_processing/dr_egeria_outbox/.obsidian/workspace.json +0 -220
  312. md_processing/dr_egeria_outbox/Untitled.canvas +0 -1
  313. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:22-dr_egeria_intro_part1.md +0 -312
  314. md_processing/dr_egeria_outbox/friday/processed-2025-08-22 21:23-dr_egeria_intro_part1.md +0 -265
  315. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:06-dr_egeria_intro_part1.md +0 -230
  316. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:30-dr_egeria_intro_part1.md +0 -296
  317. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 15:31-dr_egeria_intro_part1.md +0 -253
  318. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:08-dr_egeria_intro_part2.md +0 -343
  319. md_processing/dr_egeria_outbox/friday/processed-2025-08-23 16:12-dr_egeria_intro_part2.md +0 -343
  320. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:05-product.md +0 -426
  321. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 07:56-product.md +0 -212
  322. md_processing/dr_egeria_outbox/monday/processed-2025-08-19 09:43-product.md +0 -201
  323. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 14:55-product.md +0 -77
  324. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:05-product.md +0 -75
  325. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 15:11-product.md +0 -74
  326. md_processing/dr_egeria_outbox/sunday/processed-2025-07-20 20:40-collections.md +0 -49
  327. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 15:00-Derive-Dr-Gov-Defs.md +0 -719
  328. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:13-Derive-Dr-Gov-Defs.md +0 -41
  329. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:14-Derive-Dr-Gov-Defs.md +0 -33
  330. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 20:50-Derive-Dr-Gov-Defs.md +0 -192
  331. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:08-gov_def2.md +0 -486
  332. md_processing/dr_egeria_outbox/thursday/processed-2025-07-17 22:10-gov_def2.md +0 -486
  333. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:53-gov_def2.md +0 -486
  334. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 08:54-gov_def2.md +0 -486
  335. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:03-gov_def2.md +0 -486
  336. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:06-gov_def2.md +0 -486
  337. md_processing/dr_egeria_outbox/thursday/processed-2025-07-18 09:10-gov_def2.md +0 -486
  338. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-16 19:15-gov_def2.md +0 -527
  339. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 12:08-gov_def2.md +0 -527
  340. md_processing/dr_egeria_outbox/tuesday/processed-2025-07-17 14:27-gov_def2.md +0 -485
  341. md_processing/dr_egeria_outbox/tuesday/processed-2025-08-19 10:55-product.md +0 -209
  342. md_processing/family_docs/Data Designer/Create_Data_Class.md +0 -164
  343. md_processing/family_docs/Data Designer/Create_Data_Dictionary.md +0 -30
  344. md_processing/family_docs/Data Designer/Create_Data_Field.md +0 -162
  345. md_processing/family_docs/Data Designer/Create_Data_Specification.md +0 -36
  346. md_processing/family_docs/Data Designer/Create_Data_Structure.md +0 -38
  347. md_processing/family_docs/Data Designer/View_Data_Classes.md +0 -78
  348. md_processing/family_docs/Data Designer/View_Data_Dictionaries.md +0 -78
  349. md_processing/family_docs/Data Designer/View_Data_Fields.md +0 -78
  350. md_processing/family_docs/Data Designer/View_Data_Specifications.md +0 -78
  351. md_processing/family_docs/Data Designer/View_Data_Structures.md +0 -78
  352. md_processing/family_docs/Data Designer.md +0 -842
  353. md_processing/family_docs/Digital Product Manager/Add_Member->Collection.md +0 -42
  354. md_processing/family_docs/Digital Product Manager/Attach_Collection->Resource.md +0 -36
  355. md_processing/family_docs/Digital Product Manager/Create_Agreement.md +0 -96
  356. md_processing/family_docs/Digital Product Manager/Create_Data_Sharing_Agreement.md +0 -72
  357. md_processing/family_docs/Digital Product Manager/Create_DigitalSubscription.md +0 -102
  358. md_processing/family_docs/Digital Product Manager/Create_Digital_Product.md +0 -134
  359. md_processing/family_docs/Digital Product Manager/Link_Agreement_Items.md +0 -60
  360. md_processing/family_docs/Digital Product Manager/Link_Contracts.md +0 -26
  361. md_processing/family_docs/Digital Product Manager/Link_Digital_Product_-_Digital_Product.md +0 -30
  362. md_processing/family_docs/Digital Product Manager/Link_Subscribers.md +0 -48
  363. md_processing/family_docs/Digital Product Manager.md +0 -668
  364. md_processing/family_docs/Glossary/Attach_Category_Parent.md +0 -18
  365. md_processing/family_docs/Glossary/Attach_Term-Term_Relationship.md +0 -26
  366. md_processing/family_docs/Glossary/Create_Category.md +0 -38
  367. md_processing/family_docs/Glossary/Create_Glossary.md +0 -42
  368. md_processing/family_docs/Glossary/Create_Term.md +0 -70
  369. md_processing/family_docs/Glossary.md +0 -206
  370. md_processing/family_docs/Governance Officer/Create_Business_Imperative.md +0 -106
  371. md_processing/family_docs/Governance Officer/Create_Certification_Type.md +0 -112
  372. md_processing/family_docs/Governance Officer/Create_Governance_Approach.md +0 -114
  373. md_processing/family_docs/Governance Officer/Create_Governance_Obligation.md +0 -114
  374. md_processing/family_docs/Governance Officer/Create_Governance_Principle.md +0 -114
  375. md_processing/family_docs/Governance Officer/Create_Governance_Procedure.md +0 -128
  376. md_processing/family_docs/Governance Officer/Create_Governance_Process.md +0 -122
  377. md_processing/family_docs/Governance Officer/Create_Governance_Processing_Purpose.md +0 -106
  378. md_processing/family_docs/Governance Officer/Create_Governance_Responsibility.md +0 -122
  379. md_processing/family_docs/Governance Officer/Create_Governance_Rule.md +0 -122
  380. md_processing/family_docs/Governance Officer/Create_Governance_Strategy.md +0 -106
  381. md_processing/family_docs/Governance Officer/Create_License_Type.md +0 -112
  382. md_processing/family_docs/Governance Officer/Create_Naming_Standard_Rule.md +0 -122
  383. md_processing/family_docs/Governance Officer/Create_Regulation_Article.md +0 -106
  384. md_processing/family_docs/Governance Officer/Create_Regulation_Definition.md +0 -118
  385. md_processing/family_docs/Governance Officer/Create_Security_Access_Control.md +0 -114
  386. md_processing/family_docs/Governance Officer/Create_Security_Group.md +0 -120
  387. md_processing/family_docs/Governance Officer/Create_Service_Level_Objectives.md +0 -122
  388. md_processing/family_docs/Governance Officer/Create_Threat_Definition.md +0 -106
  389. md_processing/family_docs/Governance Officer/Link_Governance_Controls.md +0 -32
  390. md_processing/family_docs/Governance Officer/Link_Governance_Drivers.md +0 -32
  391. md_processing/family_docs/Governance Officer/Link_Governance_Policies.md +0 -32
  392. md_processing/family_docs/Governance Officer/View_Governance_Definitions.md +0 -82
  393. md_processing/family_docs/Governance Officer.md +0 -2412
  394. md_processing/family_docs/Solution Architect/Create_Information_Supply_Chain.md +0 -70
  395. md_processing/family_docs/Solution Architect/Create_Solution_Blueprint.md +0 -44
  396. md_processing/family_docs/Solution Architect/Create_Solution_Component.md +0 -96
  397. md_processing/family_docs/Solution Architect/Create_Solution_Role.md +0 -66
  398. md_processing/family_docs/Solution Architect/Link_Information_Supply_Chain_Peers.md +0 -32
  399. md_processing/family_docs/Solution Architect/Link_Solution_Component_Peers.md +0 -32
  400. md_processing/family_docs/Solution Architect/View_Information_Supply_Chains.md +0 -32
  401. md_processing/family_docs/Solution Architect/View_Solution_Blueprints.md +0 -32
  402. md_processing/family_docs/Solution Architect/View_Solution_Components.md +0 -32
  403. md_processing/family_docs/Solution Architect/View_Solution_Roles.md +0 -32
  404. md_processing/family_docs/Solution Architect.md +0 -490
  405. md_processing/md_processing_utils/debug_log +0 -574
  406. md_processing/md_processing_utils/debug_log.log +0 -0
  407. md_processing/md_processing_utils/dr-egeria-help-2025-07-17T17:22:09.md +0 -2065
  408. md_processing/md_processing_utils/generated_help_terms.md +0 -842
  409. pyegeria/.DS_Store +0 -0
  410. pyegeria/README.md +0 -35
  411. pyegeria/_client_new.py +0 -1102
  412. pyegeria/_output_formats.py +0 -730
  413. pyegeria/asset_catalog_omvs.py +0 -864
  414. pyegeria/automated_curation_omvs.py +0 -3765
  415. pyegeria/config.py +0 -523
  416. pyegeria/egeria_my_client.py +0 -91
  417. pyegeria/feedback_manager_omvs.py +0 -4573
  418. pyegeria/load_config_orig.py +0 -218
  419. pyegeria/md_processing_helpers.py +0 -58
  420. pyegeria/md_processing_utils_orig.py +0 -1103
  421. pyegeria/metadata_explorer_omvs.py +0 -2326
  422. pyegeria/my_profile_omvs.py +0 -1022
  423. pyegeria/project_manager.py +0 -1591
  424. pyegeria/registered_info.py +0 -167
  425. pyegeria/template_manager_omvs.py +0 -1414
  426. pyegeria/utils.py +0 -256
  427. pyegeria-5.4.0.28.dist-info/METADATA +0 -77
  428. pyegeria-5.4.0.28.dist-info/RECORD +0 -343
  429. pyegeria-5.4.0.28.dist-info/entry_points.txt +0 -105
  430. /commands/cat/debug_log.log → /pyegeria/deprecated/__init__.py +0 -0
  431. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  432. /pyegeria/{collection_models.py → models/collection_models.py} +0 -0
  433. {pyegeria-5.4.0.28.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
commands/__init__.py ADDED
@@ -0,0 +1,24 @@
1
+ """
2
+ SPDX-License-Identifier: Apache-2.0
3
+ Copyright Contributors to the ODPi Egeria project.
4
+
5
+
6
+
7
+ pyegeria md_commands available also from python.
8
+ """
9
+ from .cat.dr_egeria_md import process_markdown_file
10
+ from .cat.list_deployed_catalogs import list_deployed_catalogs
11
+ from .cat.list_deployed_database_schemas import list_deployed_database_schemas
12
+ from .cat.list_deployed_databases import list_deployed_databases
13
+ from .cat.list_glossaries import display_glossaries
14
+ from .cat.list_terms import display_glossary_terms
15
+ from .ops.list_catalog_targets import display_catalog_targets
16
+ from .ops.monitor_engine_activity import display_engine_activity_c
17
+ from .ops.monitor_engine_status import display_gov_eng_status
18
+ from .ops.monitor_daemon_status import display_integration_daemon_status
19
+ from .ops.table_integ_daemon_status import (
20
+ display_integration_daemon_status as table_integ_daemon_status,
21
+ )
22
+
23
+
24
+
@@ -6,8 +6,8 @@ import os
6
6
  from rich import print
7
7
  from rich.console import Console
8
8
 
9
- from pyegeria.md_processing_utils import (commands,
10
- process_provenance_command)
9
+ from pyegeria.view.md_processing_utils import (commands,
10
+ process_provenance_command)
11
11
 
12
12
  import click
13
13
  from pyegeria import (extract_command, process_glossary_upsert_command, process_term_upsert_command,
@@ -0,0 +1,197 @@
1
+ """
2
+ SPDX-License-Identifier: Apache-2.0
3
+ Copyright Contributors to the ODPi Egeria project.
4
+
5
+
6
+
7
+ Execute Glossary actions.
8
+
9
+ """
10
+
11
+ import os
12
+
13
+ import click
14
+
15
+
16
+ from pyegeria import (
17
+ EgeriaTech, body_slimmer, settings,
18
+ PyegeriaAPIException, PyegeriaClientException, print_basic_exception, print_exception_table
19
+ )
20
+ app_config = settings.Environment
21
+
22
+ EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
23
+ EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
24
+
25
+ COLLECTION_TYPES = ["Collection", "Glossary", "CollectionFolder", "RootCollection", "WorkItemList", "SolutionBlueprint" ]
26
+
27
+
28
+ @click.command("add-element-to-collection")
29
+ @click.option("--element-guid", required=True, default = "",help="GUID of the element to add to a Collection")
30
+ @click.option("--collection-guid", required=True, default = "", help="GUID of the Collection to add an element to")
31
+ @click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
32
+ @click.option(
33
+ "--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
34
+ )
35
+ @click.option("--userid", default=EGERIA_USER, help="Egeria user")
36
+ @click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
37
+ @click.option("--timeout", default=60, help="Number of seconds to wait")
38
+
39
+
40
+ def add_element_to_collection(server, url, userid, password, timeout, element_guid, collection_guid):
41
+ """Add a glossary term to a Collection"""
42
+ m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
43
+ token = m_client.create_egeria_bearer_token()
44
+ try:
45
+ element_guid = element_guid.strip()
46
+ collection_guid = collection_guid.strip()
47
+ m_client.add_to_collection(element_guid, collection_guid)
48
+
49
+ click.echo(
50
+ f"Added element with GUID: {element_guid} to Collection with GUID: {collection_guid}\n"
51
+ )
52
+
53
+ except (PyegeriaAPIException, PyegeriaClientException) as e:
54
+ print_basic_exception(e)
55
+ finally:
56
+ m_client.close_session()
57
+
58
+ @click.command("remove-element-from-collection")
59
+ @click.option("--element-guid", required=True, default = "",help="GUID of the element to remove from the collection")
60
+ @click.option("--collection-guid", required=True, default = "", help="GUID of collection to remove the element from")
61
+
62
+ @click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
63
+ @click.option(
64
+ "--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
65
+ )
66
+ @click.option("--userid", default=EGERIA_USER, help="Egeria user")
67
+ @click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
68
+ @click.option("--timeout", default=60, help="Number of seconds to wait")
69
+
70
+ def remove_element_from_collection(server, url, userid, password, timeout, element_guid, collection_guid):
71
+ """Remove an element from a Collection"""
72
+ m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
73
+ token = m_client.create_egeria_bearer_token()
74
+ try:
75
+ element_guid = element_guid.strip()
76
+ collection_guid = collection_guid.strip()
77
+ body = {
78
+ "class": "DeleteRelationshipRequestBody"
79
+ }
80
+ m_client.remove_from_collection( collection_guid, element_guid, body)
81
+
82
+ click.echo(
83
+ f"Removed term with GUID: {element_guid} from Collection with GUID: {collection_guid}\n"
84
+ )
85
+
86
+ except (PyegeriaAPIException, PyegeriaClientException) as e:
87
+ print_basic_exception(e)
88
+ finally:
89
+ m_client.close_session()
90
+
91
+
92
+ @click.command("create-collection")
93
+ @click.option("--name", help="Collection Name",default = "", required=True)
94
+ @click.option("--kind", help="Kind of Collection", default = "Collection",
95
+ type_name = click.Choice(COLLECTION_TYPES, case_sensitive=False))
96
+ @click.option(
97
+ "--description",
98
+ help="Description of the Collection",
99
+ default="A description goes here",
100
+ )
101
+ @click.option(
102
+ "--category", default = "",
103
+ help="Category of the Collection"
104
+ )
105
+ @click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use.")
106
+ @click.option(
107
+ "--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
108
+ )
109
+ @click.option("--userid", default=EGERIA_USER, help="Egeria user")
110
+ @click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
111
+ @click.option("--timeout", default=60, help="Number of seconds to wait")
112
+ def create_collection(
113
+ server: str,
114
+ url: str,
115
+ userid: str,
116
+ password: str,
117
+ timeout: int,
118
+ name: str,
119
+ kind: str,
120
+ description: str,
121
+ category: str,
122
+ ) -> None:
123
+ """Create a new Collection"""
124
+
125
+ try:
126
+ m_client = EgeriaTech(server, url, userid, password)
127
+ token = m_client.create_egeria_bearer_token()
128
+
129
+ collection_guid = m_client.create_collection( display_name = name, description = description, category = category,
130
+ prop = [kind])
131
+ print(f"New categry \'{name}\' created with id of \'{collection_guid}\'")
132
+
133
+ except (PyegeriaAPIException, PyegeriaClientException) as e:
134
+ print_basic_exception(e)
135
+ finally:
136
+ m_client.close_session()
137
+
138
+
139
+ @click.command("update-collection")
140
+ @click.option("--name", help="Collection Name", default = "",required=False)
141
+ @click.option("--description", default = "",help="Description of the Collection")
142
+ @click.option("--category", default = "", help="Category of the Collection")
143
+ @click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
144
+ @click.option(
145
+ "--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
146
+ )
147
+ @click.option("--userid", default=EGERIA_USER, help="Egeria user")
148
+ @click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
149
+ @click.option("--timeout", default=60, help="Number of seconds to wait")
150
+ @click.argument("collection-guid")
151
+
152
+ def update_collection(collection_guid, name, description, category, server, url, userid, password, timeout, ):
153
+ """Update the collection specified"""
154
+ m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
155
+ token = m_client.create_egeria_bearer_token()
156
+ try:
157
+ body = {
158
+ "class" : "UpdateElementRequestBody",
159
+ "properties": {
160
+ "class" : "CollectionProperties",
161
+ "name" : name,
162
+ "description" : description,
163
+ "category": category
164
+ },
165
+ }
166
+ m_client.update_collection(collection_guid, body_slimmer(body))
167
+
168
+ click.echo(f"Updated glossary: {collection_guid}")
169
+
170
+ except (PyegeriaAPIException, PyegeriaClientException) as e:
171
+ print_basic_exception(e)
172
+ finally:
173
+ m_client.close_session()
174
+
175
+ @click.command("delete-collection")
176
+ @click.argument("collection-guid")
177
+ @click.option("--server", default=app_config.egeria_view_server, help="Egeria view server to use")
178
+ @click.option(
179
+ "--url", default=app_config.egeria_view_server_url, help="URL of Egeria platform to connect to"
180
+ )
181
+ @click.option("--userid", default=EGERIA_USER, help="Egeria user")
182
+ @click.option("--password", default=EGERIA_USER_PASSWORD, help="Egeria user password")
183
+ @click.option("--timeout", default=60, help="Number of seconds to wait")
184
+
185
+ def delete_collection(server, url, userid, password, timeout, collection_guid):
186
+ """Delete the collection specified"""
187
+ m_client = EgeriaTech(server, url, user_id=userid, user_pwd=password)
188
+ token = m_client.create_egeria_bearer_token()
189
+ try:
190
+ m_client.delete_collection(collection_guid)
191
+
192
+ click.echo(f"Deleted collection: {collection_guid}")
193
+
194
+ except (PyegeriaAPIException, PyegeriaClientException) as e:
195
+ print_basic_exception(e)
196
+ finally:
197
+ m_client.close_session()
@@ -11,21 +11,31 @@ import os
11
11
  import sys
12
12
  import time
13
13
 
14
+ from pydantic import ValidationError
14
15
  from rich import box
15
16
  from rich.console import Console
16
17
  from rich.markdown import Markdown
17
18
  from rich.prompt import Prompt
18
19
  from rich.table import Table
19
20
  from rich.text import Text
21
+ from typing import List
22
+ from html import escape
23
+ try:
24
+ from markdown_it import MarkdownIt
25
+ except Exception:
26
+ MarkdownIt = None
20
27
 
21
28
  from pyegeria import (
22
29
  EgeriaTech,
23
- InvalidParameterException,
24
- PropertyServerException,
25
- UserNotAuthorizedException, NO_CATEGORIES_FOUND,
26
- )
27
- from commands.cat.glossary_actions import EGERIA_HOME_GLOSSARY_GUID
28
- from pyegeria._globals import NO_GLOSSARIES_FOUND
30
+ PyegeriaException, print_basic_exception, print_validation_error,
31
+ )
32
+ from pyegeria.core._exceptions import (
33
+ PyegeriaInvalidParameterException,
34
+ PyegeriaAPIException as PropertyServerException,
35
+ PyegeriaUnauthorizedException as UserNotAuthorizedException,
36
+ )
37
+ # Default glossary GUID can be provided via environment; fall back to None
38
+ EGERIA_HOME_GLOSSARY_GUID = os.environ.get("EGERIA_HOME_GLOSSARY_GUID", None)
29
39
 
30
40
  disable_ssl_warnings = True
31
41
 
@@ -48,6 +58,40 @@ EGERIA_ROOT_PATH = os.environ.get("EGERIA_ROOT_PATH", "../../")
48
58
  EGERIA_INBOX_PATH = os.environ.get("EGERIA_INBOX_PATH", "md_processing/dr_egeria_inbox")
49
59
  EGERIA_OUTBOX_PATH = os.environ.get("EGERIA_OUTBOX_PATH", "md_processing/dr_egeria_outbox")
50
60
 
61
+ def _get_console_width_from_config(default_width: int = EGERIA_WIDTH) -> int:
62
+ try:
63
+ from pyegeria.core.config import settings
64
+ return int(getattr(settings.Environment, "console_width", default_width) or default_width)
65
+ except Exception:
66
+ return default_width
67
+
68
+ def _get_outbox_dir() -> str:
69
+ root = os.environ.get("EGERIA_ROOT_PATH", EGERIA_ROOT_PATH)
70
+ out = os.environ.get("EGERIA_OUTBOX_PATH", EGERIA_OUTBOX_PATH)
71
+ return os.path.join(root, out)
72
+
73
+ def _md_to_html(md_text: str) -> str:
74
+ if not md_text:
75
+ return ""
76
+ if MarkdownIt is None:
77
+ return f"<pre>{escape(md_text)}</pre>"
78
+ try:
79
+ return MarkdownIt().render(md_text)
80
+ except Exception:
81
+ return f"<pre>{escape(md_text)}</pre>"
82
+
83
+ def _build_html_table(columns: List[str], rows: List[List[str]]) -> str:
84
+ ths = ''.join(f'<th>{escape(c)}</th>' for c in columns)
85
+ body_rows = []
86
+ for r in rows:
87
+ tds = []
88
+ for cell in r:
89
+ if isinstance(cell, str) and cell.lstrip().startswith('<table'):
90
+ tds.append(f"<td>{cell}</td>")
91
+ else:
92
+ tds.append(f"<td>{escape(cell or '')}</td>")
93
+ body_rows.append('<tr>' + ''.join(tds) + '</tr>')
94
+ return '<table>\n<thead><tr>' + ths + '</tr></thead>\n<tbody>\n' + "\n".join(body_rows) + '\n</tbody>\n</table>'
51
95
 
52
96
  def display_command_terms(
53
97
  search_string: str = "*",
@@ -60,6 +104,7 @@ def display_command_terms(
60
104
  jupyter: bool = EGERIA_JUPYTER,
61
105
  width: int = EGERIA_WIDTH,
62
106
  output_format: str = "TABLE",
107
+ mode: str = "terminal",
63
108
  ):
64
109
  """Display a table of glossary terms filtered by search_string and glossary, if specified. If no
65
110
  filters then all terms are displayed. If glossary_guid or name is specified, then only terms from that
@@ -98,26 +143,18 @@ def display_command_terms(
98
143
  try:
99
144
  g_client = EgeriaTech(view_server, view_url, user_id, user_pass)
100
145
  token = g_client.create_egeria_bearer_token(user_id, user_pass)
101
- if (glossary_name is not None) and (glossary_name != "*"):
102
- glossary_guid = g_client.get_guid_for_name(glossary_name)
103
- if glossary_guid == NO_GLOSSARIES_FOUND:
104
- console.print(
105
- f"\nThe glossary name {glossary_name} was not found. Please try using the glossary guid"
106
- )
107
- sys.exit(1)
108
- elif (glossary_guid is not None) and (len(glossary_guid) < 10):
109
- glossary_guid = None
146
+
110
147
 
111
148
  if output_format == "LIST":
112
149
  action = "LIST"
113
150
  elif output_format == "REPORT":
114
151
  action = "Report"
115
152
  if output_format != "TABLE":
116
- file_path = os.path.join(EGERIA_ROOT_PATH, EGERIA_OUTBOX_PATH)
153
+ file_path = _get_outbox_dir()
117
154
  file_name = f"Command-Help-{time.strftime('%Y-%m-%d-%H-%M-%S')}-{action}.md"
118
155
  full_file_path = os.path.join(file_path, file_name)
119
156
  os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
120
- output = g_client.find_glossary_terms(search_string, glossary_guid, output_format=output_format)
157
+ output = g_client.find_glossary_terms(search_string, output_format=output_format, report_spec="Help-Terms")
121
158
  if output == "NO_TERMS_FOUND":
122
159
  print(f"\n==> No commands found for search string '{search_string}'")
123
160
  return
@@ -127,12 +164,13 @@ def display_command_terms(
127
164
  return
128
165
 
129
166
  except (
130
- InvalidParameterException,
131
- PropertyServerException,
132
- UserNotAuthorizedException,
167
+ PyegeriaException
133
168
  ) as e:
134
- console.print_exception()
135
-
169
+ print_basic_exception(e)
170
+ except ValidationError as e:
171
+ print_validation_error(e)
172
+ except Exception as e:
173
+ console.print_exception(e)
136
174
 
137
175
 
138
176
  def generate_table(search_string: str, glossary_guid: str) -> Table:
@@ -156,25 +194,21 @@ def display_command_terms(
156
194
 
157
195
  terms = g_client.find_glossary_terms(
158
196
  search_string,
159
- glossary_guid,
160
- starts_with=False,
161
- ends_with=False,
162
- status_filter=[],
163
197
  page_size=500,
164
198
  )
165
199
 
166
- if type(terms) is str:
200
+ if isinstance(terms, str):
167
201
  print(f"No commands found - this was not the command you were looking for?! - {search_string} : {glossary_guid} ")
168
202
  sys.exit(0)
169
203
  sorted_terms = sorted(
170
- terms, key=lambda k: k["glossaryTermProperties"].get("displayName","---")
204
+ terms, key=lambda k: (k.get("properties") or {}).get("displayName","---")
171
205
  )
172
206
  style = "bright_white on black"
173
207
  if type(terms) is str:
174
208
  return table
175
209
  glossary_info = {}
176
210
  for term in sorted_terms:
177
- props = term.get("glossaryTermProperties", "None")
211
+ props = term.get("properties", "None")
178
212
  if props == "None":
179
213
  return table
180
214
 
@@ -193,11 +227,9 @@ def display_command_terms(
193
227
  usage = props.get("usage", "---")
194
228
  # ex_us_out = Markdown(f"Example:\n{example}\n---\nUsage: \n{usage}")
195
229
 
196
- classifications = term["elementHeader"]["classifications"]
230
+ classifications = term["elementHeader"].get("classifications",None)
197
231
  glossary_guid = None
198
- for c in classifications:
199
- if c["classificationName"] == "Anchors":
200
- glossary_guid = c["classificationProperties"]["anchorScopeGUID"]
232
+
201
233
 
202
234
  if glossary_guid and glossary_guid in glossary_info:
203
235
  glossary_name = glossary_info[glossary_guid]
@@ -218,16 +250,77 @@ def display_command_terms(
218
250
  Markdown(usage),
219
251
  style="bold white on black",
220
252
  )
253
+ if not classifications:
254
+ continue
255
+ for c in classifications:
256
+ if c["classificationName"] == "Anchors":
257
+ glossary_guid = c["classificationProperties"]["anchorScopeGUID"]
221
258
 
222
259
  g_client.close_session()
223
260
  return table
224
261
 
262
+ # Shared fetch for md modes
263
+ if mode in ("md", "md-html"):
264
+ try:
265
+ terms = g_client.find_glossary_terms(search_string, page_size=500)
266
+ except Exception:
267
+ terms = []
268
+ if isinstance(terms, str) and terms == "NO_TERMS_FOUND":
269
+ print(f"\n==> No commands found for search string '{search_string}'")
270
+ return
271
+ # Build outputs
272
+ out_dir = _get_outbox_dir()
273
+ os.makedirs(out_dir, exist_ok=True)
274
+ stamp = time.strftime('%Y-%m-%d-%H-%M-%S')
275
+ if mode == "md":
276
+ # Simple sections per term
277
+ lines: List[str] = []
278
+ lines.append(f"# Dr.Egeria Commands (search: `{search_string}`)")
279
+ lines.append("")
280
+ sorted_terms = sorted(terms, key=lambda t: (t.get("properties") or {}).get("displayName", "---"))
281
+ for term in sorted_terms:
282
+ props = term.get("properties") or {}
283
+ name = props.get("displayName", "---") or "---"
284
+ desc = props.get("description", "") or ""
285
+ usage = props.get("usage", "") or ""
286
+ lines.append(f"## {name}")
287
+ lines.append("")
288
+ lines.append("### Description\n")
289
+ lines.append(desc if desc.strip() else "_No description_")
290
+ lines.append("")
291
+ if usage.strip():
292
+ lines.append("### Usage\n")
293
+ lines.append(usage)
294
+ lines.append("")
295
+ lines.append("---\n")
296
+ content = "\n".join(lines)
297
+ file_name = f"Command-Help-{stamp}-md.md"
298
+ else:
299
+ # md-html nested tables
300
+ columns = ["Command", "Description", "Usage"]
301
+ rows: List[List[str]] = []
302
+ sorted_terms = sorted(terms, key=lambda t: (t.get("properties") or {}).get("displayName", "---"))
303
+ for term in sorted_terms:
304
+ props = term.get("properties") or {}
305
+ name = props.get("displayName", "---") or "---"
306
+ desc = props.get("description", "") or ""
307
+ usage_md = props.get("usage", "") or ""
308
+ usage_html = _md_to_html(usage_md).strip()
309
+ rows.append([name, desc, usage_html])
310
+ content = f"# Dr.Egeria Commands (search: `{search_string}`)\n\n" + _build_html_table(columns, rows) + "\n"
311
+ file_name = f"Command-Help-{stamp}-md-html.md"
312
+ full_file_path = os.path.join(out_dir, file_name)
313
+ with open(full_file_path, 'w', encoding='utf-8') as f:
314
+ f.write(content)
315
+ print(f"\n==> Help written to {full_file_path}")
316
+ return
317
+
225
318
  try:
226
319
  with console.pager(styles=True):
227
320
  console.print(generate_table(search_string, glossary_guid))
228
321
 
229
322
  except (
230
- InvalidParameterException,
323
+ PyegeriaInvalidParameterException,
231
324
  PropertyServerException,
232
325
  UserNotAuthorizedException,
233
326
  ) as e:
@@ -242,6 +335,8 @@ def main():
242
335
  parser.add_argument("--userid", help="User Id")
243
336
  parser.add_argument("--password", help="User Password")
244
337
  parser.add_argument("--guid", help="GUID of glossary to search")
338
+ parser.add_argument("--mode", choices=["terminal","md","md-html"], default="terminal", help="Output mode: terminal (default) prints Rich table; md writes Markdown; md-html writes Markdown with HTML tables.")
339
+ parser.add_argument("--search", help="Search string for commands", default=None)
245
340
 
246
341
  args = parser.parse_args()
247
342
 
@@ -254,13 +349,17 @@ def main():
254
349
  guid = args.guid if args.guid is not None else EGERIA_HOME_GLOSSARY_GUID
255
350
 
256
351
  try:
257
- search_string = Prompt.ask("Enter the command you are searching for:", default="*")
352
+ search_default = args.search or "*"
353
+ search_string = args.search or Prompt.ask("Enter the command you are searching for:", default=search_default)
258
354
 
259
- output_format = Prompt.ask("What output format do you want?", choices=["TABLE", "LIST", "REPORT"], default="TABLE")
355
+ if args.mode == "terminal":
356
+ output_format = Prompt.ask("What output format do you want?", choices=["TABLE", "LIST", "REPORT"], default="TABLE")
357
+ else:
358
+ output_format = "TABLE"
260
359
 
261
360
  display_command_terms(
262
- search_string, guid, 'Egeria-Markdown', server, url,
263
- userid, user_pass, output_format= output_format
361
+ search_string, guid, 'Egeria-Markdown', server, url,
362
+ userid, user_pass, output_format=output_format, mode=args.mode
264
363
  )
265
364
 
266
365
  except KeyboardInterrupt:
@@ -8,13 +8,13 @@ from rich import print
8
8
  from rich.console import Console
9
9
 
10
10
  from pyegeria.egeria_tech_client import EgeriaTech
11
- from pyegeria.md_processing_utils import (extract_command, process_glossary_upsert_command, process_term_upsert_command,
12
- get_current_datetime_string, process_per_proj_upsert_command, command_list,
13
- )
11
+ from pyegeria.view.md_processing_utils import (extract_command, process_glossary_upsert_command, process_term_upsert_command,
12
+ get_current_datetime_string, process_per_proj_upsert_command, command_list,
13
+ )
14
14
  import click
15
15
 
16
- from pyegeria._exceptions import (
17
- print_exception_response,
16
+ from pyegeria.core._exceptions import (
17
+ print_basic_exception, PyegeriaException,
18
18
  )
19
19
 
20
20
  EGERIA_METADATA_STORE = os.environ.get("EGERIA_METADATA_STORE", "active-metadata-store")
@@ -113,8 +113,8 @@ def process_jupyter_notebook(
113
113
  else:
114
114
  click.echo("\nNo updates detected. New file not created.")
115
115
 
116
- except Exception as e:
117
- print_exception_response(e)
116
+ except PyegeriaException as e:
117
+ print_basic_exception(e)
118
118
  return
119
119
 
120
120